/*
 * @Author: dongdong.wu
 * @Date: 2020-07-14 14:41:00
 * @LastEditTime: 2021-03-26 18:00:20
 * @FilePath: \ncim_web\src\components\weComponents\weTable\utils.js
 * @Description: weTable 组件方法
 */
var currency = require("currency.js");

/**
 * @description 金额格式化
 * @param {*} value
 * @param {*} precision
 */
const _currency = (value, precision = 2) => {
  if (value) {
    return currency(value, {
      precision: precision
    }).format();
  } else {
    return value;
  }
};

/**
 *
 * @param {Object} param data以及列字段属性columns
 * @param {Array} headers 自定义表头属性
 * @param {String} sumText 首列提示标题
 * @param {Array} levelColums  自定义表头属性（多级）
 */
const summaryMethod = (param, headers, sumText, levelColums) => {
  const { data } = param;
  const sums = [];
  const _columns = levelColums ? levelColums : headers;
  _columns.forEach((column, index) => {
    if (index === 0) {
      sums[index] = sumText;
      return;
    }
    if (column.isSum) {
      // 需要合计的列就设置为true
      const values = data.map(item => Number(item[column.prop]));
      if (!values.every(value => isNaN(value))) {
        const sumIndex = values.reduce((prev, curr) => {
          const value = Number(curr);
          if (!isNaN(value)) {
            return prev + curr;
          } else {
            return prev;
          }
        }, 0);
        if (column.isFormat) {
          sums[index] = sumIndex;
        } else {
          sums[index] = _currency(sumIndex);
        }
      } else {
        sums[index] = "";
      }
    }
  });
  return sums;
};

/**
 * @description  合并单元格所用。返回相同数据列数
 * @param {Array} data 表数据
 * @param {Object} row 行数据
 * @param {Object} spanOption 配置
 */
const spanTableData = (data = [], row, spanOption) => {
  const sameData = data.filter(
    i => i[spanOption.spanKey] === row[spanOption.spanKey]
  );
  const _col = sameData.length;
  const _rowIndex = data.findIndex(
    i => i[spanOption.spanKey] === row[spanOption.spanKey]
  );
  return {
    _col,
    _rowIndex
  };
};

/**
 * @description 合并单元格（行合并）
 * @param {Object} param0 table 的行和列以及对应的index数据
 * @param {Object} spanOption table设置合并props
 * @param {Array} data table数据
 */
const rowSpanMethod = (
  { row, column, rowIndex, columnIndex },
  spanOption,
  data = []
) => {
  if (spanOption.spanIndex.includes(columnIndex)) {
    const { _col, _rowIndex } = spanTableData(data, row, spanOption);
    if (rowIndex === _rowIndex) {
      // 第一个位置就进行合并，后面就不合并
      return {
        rowspan: _col,
        colspan: 1
      };
    } else {
      return {
        rowspan: 0,
        colspan: 0
      };
    }
  }
};

/**
 * @description 合并单元格（列合并）.主要针对生成表单用到
 * @param {*} param0 table 的行和列以及对应的index数据
 * @param {*} colspanOption 设置合并。
 * 其中当行数据中的hasExpand为1表示需要合并colSpan列，为2标识不需要合并
 */
const colSpanMethod = ({ row, column, columnIndex }, { colSpan }) => {
  if (columnIndex == 0 && row.hasExpand == 1) {
    return [1, colSpan];
  } else if (
    row.hasExpand == undefined ||
    row.hasExpand == 2 ||
    columnIndex == colSpan
  ) {
    return [1, 1];
  } else {
    return [0, 0];
  }
};
export { summaryMethod, rowSpanMethod, colSpanMethod };
